// 错误写法
// const obj: object = {
//     name: 'qf001',
//     age: 18
// }
// console.log(obj.name)   // 类型 "object" 上不存在属性 "name"
// console.log(obj.age)    // 类型 "object" 上不存在属性 "age"

// 当前已经完成了给对象添加类型校验, 但是当前的方式仅适用于对象内属性比较少的时候
// const obj: {
//     // 属性的间隔可以是 换行(啥也不写)/分号/逗号
//     name: string
//     age: number
// } = {
//     name: "qf001",
//     age: 18,
// };

// obj.name = 'qf002'
// obj.age = 28
// // obj.age = true  // 不能将类型 "boolean" 分配给类型 "number"

// console.log(obj.name);
// console.log(obj.age);

// 代码属性多, 当前的方式会导致代码的可读性下降, 但是功能没有问题
// const obj: {
//     a1: number;
//     a2: number;
//     a3: number;
//     a4: number;
//     a5: number;
//     a6: number;
//     a7: number;
//     a8: number;
//     a9: number;
// } = {
//     a1: 1,
//     a2: 1,
//     a3: 1,
//     a4: 1,
//     a5: 1,
//     a6: 1,
//     a7: 1,
//     a8: 1,
//     a9: 1,
// };

// 利用 接口 解决上述问题

// interface 接口名 (一般: I + 变量的名字) {}
// interface IObj {
//      // 属性的间隔可以是 换行(啥也不写)/分号/逗号
//     a1: number;
//     a2: number;
//     a3: number;
//     a4: number;
//     a5: number;
//     a6: number;
//     a7: number;
//     a8: number;
//     a9: number;
// }

// const obj: IObj = {
//     a1: 1,
//     a2: 1,
//     a3: 1,
//     a4: 1,
//     a5: 1,
//     a6: 1,
//     a7: 1,
//     a8: 1,
//     a9: 1,
// };

// 接口的嵌套
// interface IObj {
//     name: string,
//     id: number,
//     info: {
//         width: number,
//         height: number,
//         bo: boolean
//     }
// }


// 如果 接口IInfo 使用次数比较多, 可以抽离出来, 否则不建议
interface IInfo {
    width: number;
    height: number;
    bo: boolean;
}

interface IObj {
    name: string;
    id: number;
    info: IInfo
}

const obj: IObj = {
    name: "qf001",
    id: 10086,
    info: {
        width: 100,
        height: 200,
        bo: true,
    },
};

// obj.info.bo = '10086'   // 不能将类型 "string" 分配给类型 "boolean"

console.log(obj.info.bo);
